package com.zgis.module.bas.bean;

import com.fasterxml.jackson.databind.node.ArrayNode;
import com.zgis.module.bas.constant.CxKeys;
import com.fasterxml.jackson.databind.node.ObjectNode;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 修改记录:
 * 24-09-29     zhengchaojun             首次创建
 */

/**
 * 类描述：服务器返回给客户端的对象
 */
public class CxRet
{
    /**
     * 设置ObjectNode的成功状态，默认返回码为0。
     *
     * @param jo 要修改的ObjectNode对象。
     */
    public static void setSuccess(ObjectNode jo)
    {
        jo.put(CxKeys.ret, 0);
    }

    /**
     * 设置ObjectNode的成功状态，并添加数据和对象标志。
     *
     * @param jo 要修改的ObjectNode对象。
     * @param data 要添加的数据列表。
     * @param bObject 是否将数据视为单个对象。
     * @throws Exception 如果处理过程中发生错误。
     */
    public static void setSuccess(ObjectNode jo, List<Map<String, Object>> data, boolean bObject) throws Exception
    {
        jo.put(CxKeys.ret, 0);
        if (bObject)
        {
            jo.put(CxKeys.retType, 1);
        }

        if (data != null)
        {
            jo.putPOJO(CxKeys.data, data);
        }
    }

    /**
     * 设置ObjectNode的成功状态，并添加单个数据和对象标志。
     *
     * @param jo 要修改的ObjectNode对象。
     * @param data 要添加的单个数据映射。
     * @param bObject 是否将数据视为单个对象。
     * @throws Exception 如果处理过程中发生错误。
     */
    public static void setSuccess(ObjectNode jo, Map<String, Object> data, boolean bObject) throws Exception
    {
        jo.put(CxKeys.ret, 0);
        if (bObject)
        {
            jo.put(CxKeys.retType, 1);
        }

        if (data != null)
        {
            ArrayList<Map<String, Object>> list = new ArrayList(1);
            list.add(data);
            jo.putPOJO(CxKeys.data, list);
        }
    }

    /**
     * 设置ObjectNode的成功状态，并添加单个键值对数据。
     *
     * @param jo 要修改的ObjectNode对象。
     * @param key 数据的键。
     * @param value 数据的值。
     * @throws Exception 如果处理过程中发生错误。
     */
    public static void setSuccess(ObjectNode jo, String key, Object value) throws Exception
    {
        jo.put(CxKeys.ret, 0);
        jo.put(CxKeys.retType, 1);
        if (key != null)
        {
            ArrayList<Map<String, Object>> list = new ArrayList(1);
            Map<String, Object>            data = new HashMap(1);
            data.put(key, value);
            list.add(data);
            jo.putPOJO(CxKeys.data, list);
        }

    }

    /**
     * 设置ObjectNode的成功状态，并添加ArrayNode数据。
     *
     * @param jo 要修改的ObjectNode对象。
     * @param data 要添加的ArrayNode数据。
     * @param bObject 是否将数据视为单个对象。
     * @throws Exception 如果处理过程中发生错误。
     */
    public static void setSuccess(ObjectNode jo, ArrayNode data, boolean bObject) throws Exception
    {
        jo.put(CxKeys.ret, 0);
        if (bObject)
        {
            jo.put(CxKeys.retType, 1);
        }

        if (data != null)
        {
            jo.putPOJO(CxKeys.data, data);
        }

    }

    /**
     * 设置ObjectNode的成功状态，并添加ObjectNode数据。
     *
     * @param jo 要修改的ObjectNode对象。
     * @param data 要添加的ObjectNode数据。
     * @param bObject 是否将数据视为单个对象。
     * @throws Exception 如果处理过程中发生错误。
     */
    public static void setSuccess(ObjectNode jo, ObjectNode data, boolean bObject) throws Exception
    {
        jo.put(CxKeys.ret, 0);
        if (bObject)
        {
            jo.put(CxKeys.retType, 1);
        }

        if (data != null)
        {
            ArrayList<Object> list = new ArrayList(1);
            list.add(data);
            jo.putPOJO(CxKeys.data, list);
        }

    }

    /**
     * 设置ObjectNode的失败状态，默认返回码为1。
     *
     * @param jo 要修改的ObjectNode对象。
     */
    public static void setFailed(ObjectNode jo)
    {
        jo.put(CxKeys.ret, 1);
    }

    /**
     * 设置ObjectNode的错误状态，并添加错误码和消息。
     *
     * @param jo 要修改的ObjectNode对象。
     * @param errcode 错误码。
     * @param msg 错误消息。
     */
    public static void setError(ObjectNode jo, String errcode, String msg)
    {
        jo.put(CxKeys.ret, 1);
        if (errcode != null)
        {
            jo.put(CxKeys.errcode, errcode);
        }

        if (msg != null)
        {
            jo.put(CxKeys.msg, msg);
        }
    }

    /**
     * 设置ObjectNode的错误状态，并添加异常信息。
     *
     * @param jo 要修改的ObjectNode对象。
     * @param e 异常对象。
     */
    public static void setError(ObjectNode jo, Exception e)
    {
        jo.put(CxKeys.ret, 1);
        jo.put(CxKeys.msg, e.getMessage());
    }

    /**
     * 设置ObjectNode的错误状态，并指定错误码。
     *
     * @param jo 要修改的ObjectNode对象。
     * @param errcode 要设置的错误码。
     */
    public static void setErrcode(ObjectNode jo, String errcode)
    {
        jo.put(CxKeys.ret, 1);
        jo.put(CxKeys.errcode, errcode);
    }

    /**
     * 设置ObjectNode的错误状态，并添加错误消息。
     *
     * @param jo 要修改的ObjectNode对象。
     * @param msg 要添加的错误消息。
     */
    public static void setMsg(ObjectNode jo, String msg)
    {
        jo.put(CxKeys.ret, 1);
        jo.put(CxKeys.msg, msg);
    }

    /**
     * 设置ObjectNode的错误状态，并添加复杂的错误消息（ObjectNode）。
     *
     * @param jo 要修改的ObjectNode对象。
     * @param msg 要添加的复杂错误消息（ObjectNode）。
     */
    public static void setMsg(ObjectNode jo, ObjectNode msg)
    {
        jo.put(CxKeys.ret, 1);
        jo.putPOJO(CxKeys.msg, msg);
    }

    /**
     * 打印异常信息和堆栈跟踪到标准输出。
     *
     * @param prompt 异常前的提示信息。
     * @param e 要打印的异常对象。
     */
    public static void outException(String prompt, Exception e)
    {
        System.out.println(prompt);
        System.out.println(e.getMessage());
        e.printStackTrace();
    }
}
